/*
 * Copyright (c) 2017,重庆阿莫比科技有限公司,All Rights Reserved.
 */
package com.wowocai.btchina.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * <br/>
 * Date: 2017年3月21日 下午2:21:20 <br/>
 * 
 * @Author 刘建成
 * @Version
 */
@Service
public class SearchEngineServiceImpl {

    final static Logger logger = LoggerFactory.getLogger(SearchEngineServiceImpl.class);

    // @Value("${mongo.spider.dbname}")
    // private String spriderDbName;
    //
    // @Value("${mongo.spider.btchina}")
    // private String spriderTbName;
    //
    // @Value("${mongo.spider.setting}")
    // private String settingTbName;
    //
    // @Value("${elasticsearch.cluster.name}")
    // private String esClusterName;
    //
    // @Value("${elasticsearch.cluster.host}")
    // private String esClusterHost;
    //
    // @Value("${elasticsearch.cluster.port}")
    // private int esClusterPort;
    //
    // @Value("${elasticsearch.torrent.index}")
    // private String torrentIndex;
    //
    // @Value("${elasticsearch.torrent.type}")
    // private String torrentType;
    //
    // @Value("${web.sitemap.path}")
    // private String sitemapPath;
    //
    // @Value("${web.domain}")
    // private String domain;
    //
    // // private TorrentEsClient torrentEsClient = null;
    //
    // private Date getLatestSyncTime(String key) {
    // // 1.拿到最后一次入库的时间
    // MongoCollection<Document> conn = MongoFactory.getMongoCollection(spriderDbName, settingTbName);
    // BasicDBObject query = new BasicDBObject("_id", key);
    //
    // FindIterable<Document> latest = conn.find(query).limit(1);
    // MongoCursor<Document> iterator = latest.iterator();
    // Date mindate = null;
    // while (iterator.hasNext()) {
    // Document next = iterator.next();
    // mindate = next.getDate("values");
    // break;
    // }
    // iterator.close();
    // return mindate;
    // }
    //
    // private Date getLatestCreateTime() { // 2.拿到当前系统中最后一条数据的入库时间
    // MongoCollection<Document> conn = MongoFactory.getMongoCollection(spriderDbName, spriderTbName);
    // // 先找到日期最大的条 -1 是倒序 1是正序
    // FindIterable<Document> max = conn.find().limit(1).sort(new BasicDBObject("createTime", -1));
    // MongoCursor<Document> max_ = max.iterator();
    // Date maxdate = null;
    // // String maxdate_ = null;
    // while (max_.hasNext()) {
    // maxdate = max_.next().getDate("createTime");
    // break;
    // }
    // max_.close();
    // return maxdate;
    // }
    //
    // private void saveLatestSyncTime(String key, Date date, boolean isNew) {
    // // 6.保存最后一次入库时间
    // MongoCollection<Document> conn = MongoFactory.getMongoCollection(spriderDbName, settingTbName);
    // // BasicDBObject query = new BasicDBObject("_id",
    // // "latest_sync_time").append("values", date);
    // if (isNew) {
    // Document document = new Document("_id", key);
    // document.put("values", date);
    // conn.insertOne(document);
    // } else {
    // conn.updateOne(new BasicDBObject("_id", key), new BasicDBObject("$set", new BasicDBObject("values", date)));
    // }
    // }
    //
    // public static void main(String[] args) throws UnsupportedEncodingException {
    // // Calendar yestaday = Calendar.getInstance();
    // // yestaday.add(Calendar.DATE, -1);
    // // String today = TimeUtils.format(yestaday.getTime(), "yyyy-MM-dd");
    // // System.out.println(today);
    //
    // String name = "1200 Micrograms - 96%;& [2012]".replaceAll("[\\p{Punct}+\\s+]", "-");
    // String url = "https://www.magnet.com/detail/345342424234/" + URLEncoder.encode(name, "UTF-8") + ".html";
    // System.out.println(url);
    // }
    //
    // @Override
    // public void pushMongoToElasticsearch() {
    // // 1.拿到最后一次入库的时间
    // Date mindate = getLatestSyncTime("latest_sync_time");
    // // 2.拿到当前系统中最后一条数据的入库时间
    // Date maxdate = getLatestCreateTime();
    //
    // // 3. 没数据时直接返回
    // if (maxdate == null) {
    // logger.warn("当前数据库中没有数据哟!");
    // return;
    // }
    // BasicDBObject query = null;
    // if (mindate == null) {
    // query = (BasicDBObject) QueryBuilder.start("createTime").lessThanEquals(maxdate).get();
    // } else {
    // query = (BasicDBObject) QueryBuilder.start("createTime").greaterThan(mindate).and("createTime")
    // .lessThanEquals(maxdate).get();
    // }
    // // 4. 得到es客户端
    // if (torrentEsClient == null)
    // torrentEsClient = getElasticClient();
    // MongoCollection<Document> conn = MongoFactory.getMongoCollection(spriderDbName, spriderTbName);
    // FindIterable<Document> result = conn.find(query).batchSize(100);
    // MongoCursor<Document> mongoCursor = result.iterator();
    // try {
    // int count = 0;
    // long total = 0;
    // List<Document> list1 = new ArrayList<Document>(100);
    // // 5. 批量将数据导入到es中
    // while (mongoCursor.hasNext()) {
    // total++;
    // count++;
    // list1.add(mongoCursor.next());
    // if (count == 100) {
    // torrentEsClient.bulkAddTorrent4Mongo(torrentIndex, torrentType, list1);
    // count = 0;
    // list1 = new ArrayList<Document>(100);
    // }
    // }
    // torrentEsClient.bulkAddTorrent4Mongo(torrentIndex, torrentType, list1);
    // logger.info("成功入库到ES[{}]条数据", total);
    // } catch (Exception e) {
    // logger.error("批量入库到ES时出现异常", e);
    // } finally {
    // mongoCursor.close();
    // }
    // // 6.保存最后一次入库时间
    // saveLatestSyncTime("latest_sync_time", maxdate, mindate == null);
    // }
    //
    // private TorrentEsClient getElasticClient() {
    // // 4. 得到es客户端
    // TorrentEsClient client = null;
    // try {
    // client = new TorrentEsClient(esClusterName, esClusterHost, esClusterPort);
    // } catch (Exception e) {
    // logger.error("初始化ElasticSearch连接时出现异常", e);
    // return null;
    // }
    // return client;
    // }
    //
    // @Override
    // public void syncVisitCountToEsByDate() {
    // TorrentEsClient client = getElasticClient();
    // if (client == null)
    // return;
    // // 查到当天有更新的数据
    // Calendar yestaday = Calendar.getInstance();
    // yestaday.add(Calendar.DATE, -1);
    // String today = TimeUtils.format(yestaday.getTime(), "yyyy-MM-dd");
    // BasicDBObject query = (BasicDBObject) QueryBuilder.start("lastUpdate").is(today).and("createDate")
    // .notEquals(today).get();
    // // BasicDBObject query = new BasicDBObject("lastUpdate",
    // // TimeUtils.now("yyyy-MM-dd"));
    // MongoCollection<Document> conn = MongoFactory.getMongoCollection(spriderDbName, spriderTbName);
    // FindIterable<Document> result = conn.find(query).batchSize(100);
    // MongoCursor<Document> mongoCursor = result.iterator();
    // try {
    // int count = 0;
    // long total = 0;
    // List<Document> list1 = new ArrayList<Document>(100);
    // // 5. 批量将数据导入到es中
    // while (mongoCursor.hasNext()) {
    // total++;
    // count++;
    // list1.add(mongoCursor.next());
    // if (count == 100) {
    // client.bulkUpdateTorrent4Mongo(torrentIndex, torrentType, list1);
    // count = 0;
    // list1 = new ArrayList<Document>(100);
    // }
    // }
    // client.bulkUpdateTorrent4Mongo(torrentIndex, torrentType, list1);
    // logger.info("成功入库到ES{}条数据", total);
    // } catch (Exception e) {
    // logger.error("批量入库到ES时出现异常", e);
    // } finally {
    // mongoCursor.close();
    // }
    //
    // }
    //
    // /**
    // * 检查是否受DMCA版权保护
    // *
    // * @param hash
    // * @return
    // */
    // private boolean isCopyRight(String hash) {
    // try {
    // MongoCollection<Document> conn = MongoFactory.getMongoCollection(spriderDbName, "dmca");
    // long count = conn.count(new BasicDBObject("_id", hash));
    // return count > 0;
    // } catch (Exception e) {
    // return false;
    // }
    // }
    //
    // @Override
    // public WebTorrentEntity findTorrentByInfohash(String infohash) {
    // // 检查是否受版权保护
    // if (isCopyRight(infohash)) {
    // return null;
    // }
    //
    // if (torrentEsClient == null)
    // torrentEsClient = getElasticClient();
    // GetResponse doc = torrentEsClient.findById(torrentIndex, torrentType, infohash);
    // String json = null;
    // WebTorrentEntity bean = null;
    // if (doc == null) {
    // MongoCollection<Document> conn = MongoFactory.getMongoCollection(spriderDbName, spriderTbName);
    //
    // FindIterable<Document> result = conn.find(new BasicDBObject("_id", infohash)).batchSize(1);
    // MongoCursor<Document> mongoCursor = result.iterator();
    // if (mongoCursor.hasNext()) {
    // Document doc_ = mongoCursor.next();
    // Date createTime = doc_.getDate("createTime");
    // doc_.remove("createTime");
    // doc_.remove("__v");
    // json = doc_.toJson();
    // bean = JacksonUtil.readValue(json, WebTorrentEntity.class);
    // bean.setCreateTime(createTime);
    // } else {
    // return null;
    // }
    // } else {
    // json = doc.getSourceAsString();
    // bean = JacksonUtil.readValue(json, WebTorrentEntity.class);
    // }
    // if (bean == null) {
    // return null;
    // }
    // String name = bean.getName();
    // if (isBlank(name)) {
    // return null;
    // }
    // bean.setOrname(formatName(name));
    // List<String> keys = torrentEsClient.analyze(torrentIndex, name);
    // bean.setKeys(keys);
    // return bean;
    // }
    //
    // private FileWriter createNewSiteMapFile(String path, String day, int index) throws IOException {
    // File file = new File(path, day + "_" + index + ".xml");
    // if (!file.getParentFile().exists()) {
    // file.getParentFile().mkdirs();
    // }
    // if (file.exists()) {
    // file.delete();
    // }
    // FileWriter writer = new FileWriter(file, true);
    // // Start
    // writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
    // writer.write(
    // "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"
    // xmlns:video=\"http://www.google.com/schemas/sitemap-video/1.1\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"
    // >\n");
    // writer.write("<url><loc>https://" + domain + "/</loc>\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"en\" ref=\"https://" + domain + "/en/\" />\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"ar\" ref=\"https://" + domain + "/ar/\" />\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"de\" ref=\"https://" + domain + "/de/\" />\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"es\" ref=\"https://" + domain + "/es/\" />\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"fr\" ref=\"https://" + domain + "/fr/\" />\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"it\" ref=\"https://" + domain + "/it/\" />\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"ja\" ref=\"https://" + domain + "/ja/\" />\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"pt\" ref=\"https://" + domain + "/pt/\" />\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"ru\" ref=\"https://" + domain + "/ru/\" />\n");
    // writer.write("<xhtml:link rel=\"alternate\" hreflang=\"zh\" ref=\"https://" + domain + "/zh/\" />\n");
    // writer.write("<lastmod>");
    // writer.write(day);
    // writer.write("</lastmod><changefreq>always</changefreq><priority>1</priority></url>\n");
    // writer.flush();
    // return writer;
    // }
    //
    // private String formatName(String name) {
    // if (isBlank(name)) {
    // return "index";
    // }
    // String[] names = name.split("[\\p{Punct}+\\s+]");
    // StringBuffer sb = new StringBuffer();
    // for (String str : names) {
    // if (!isBlank(str)) {
    // sb.append(str).append("-");
    // }
    // }
    // String result = sb.toString();
    // if (isBlank(result)) {
    // return "";
    // }
    // return result.substring(0, result.length() - 1);
    // }
    //
    // private static boolean isBlank(String str) {
    // return (str == null || str.trim().length() == 0);
    // }
    //
    // @Override
    // public void createSiteMap() {
    // String dayPath = sitemapPath + "/daily";
    //
    // Calendar yestaday = Calendar.getInstance();
    // yestaday.add(Calendar.DATE, -1);
    // String today = TimeUtils.format(yestaday.getTime(), "yyyy-MM-dd");
    //
    // // 1.拿到最后一次入库的时间
    // Date last = getLatestSyncTime("latest_sitemap_time");
    //
    // BasicDBObject query = null;
    // boolean isNew = true;
    // // 没生成时取全部的数据
    // if (last == null) {
    // query = new BasicDBObject();
    // } else {
    // isNew = false;
    // query = (BasicDBObject) QueryBuilder.start()
    // .or(new BasicDBObject("createDate", today), new BasicDBObject("lastUpdate", today)).get();
    //
    // }
    // // BasicDBObject query = new BasicDBObject("lastUpdate",
    // // TimeUtils.now("yyyy-MM-dd"));
    // MongoCollection<Document> conn = MongoFactory.getMongoCollection(spriderDbName, spriderTbName);
    // FindIterable<Document> result = conn.find(query).batchSize(100);
    // int index = 1;
    // long total = 0;
    // try {
    // FileWriter writer = createNewSiteMapFile(dayPath, today, index);
    // int currentCount = 0;
    // // 查出数据并生成文件
    // MongoCursor<Document> mongoCursor = result.iterator();
    // try {
    // // 5. 批量将数据导入到es中
    // while (mongoCursor.hasNext()) {
    // total++;
    // currentCount++;
    // Document doc = mongoCursor.next();
    // String name = doc.getString("name");
    // if (isBlank(name)) {
    // continue;
    // }
    // name = formatName(name);
    // String url = "https://" + domain + "/detail/" + doc.getString("infohash") + "/"
    // + URLEncoder.encode(name, "UTF-8") + ".html";
    // StringBuffer sb = new StringBuffer("<url><loc>");
    // sb.append(url).append("</loc><lastmod>");
    // sb.append(today)
    // .append("</lastmod><changefreq>weekly</changefreq><priority>0.5</priority></url>\n");
    // writer.write(sb.toString());
    // if (total % 100 == 0) {
    // writer.flush();
    // }
    // // 每30000条打包一个文件
    // if (currentCount == 30000) {
    // currentCount = 0;
    // // END
    // writer.write("</urlset>");
    // writer.flush();
    // writer.close();
    // // 新起一个文件
    // index++;
    // writer = createNewSiteMapFile(dayPath, today, index);
    // }
    // }
    // logger.info("成功生成{}的网站地图{}条", today, total);
    // } catch (Exception e) {
    // logger.error("生成{}的网站地图时出现异常", e);
    // } finally {
    // mongoCursor.close();
    // }
    //
    // // END
    // writer.write("</urlset>");
    // writer.flush();
    // writer.close();
    // } catch (IOException e) {
    //
    // }
    // File dir = new File(dayPath);
    // File[] xmls = dir.listFiles(new FilenameFilter() {
    //
    // @Override
    // public boolean accept(File dir, String name) {
    // if (name == null) {
    // return false;
    // }
    // return name.endsWith(".xml");
    // }
    // });
    // if (xmls == null || xmls.length == 0) {
    // return;
    // }
    // for (File sitemap : xmls) {
    // try {
    // GZIPUtils.compress(sitemap, true);
    // } catch (Exception e1) {
    // logger.error("压缩文件时出现异常", e1);
    // }
    // }
    // // 生成site index文件
    // File[] files = dir.listFiles();
    // if (files == null || files.length == 0) {
    // return;
    // }
    // File siteIndex = new File(sitemapPath, "sitemap.xml");
    // try (FileWriter writer = new FileWriter(siteIndex, false)) {
    // writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
    // writer.write("<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n");
    // for (File f : files) {
    // long modified = f.lastModified();
    // writer.write("<sitemap><loc>https://" + domain + "/daily/" + f.getName() + "</loc><lastmod>"
    // + TimeUtils.format(new Date(modified)) + "</lastmod></sitemap>\n");
    // }
    // writer.write("</sitemapindex>");
    // writer.flush();
    // } catch (IOException e) {
    // logger.error("生成{}的网站地图时出现异常", e);
    // }
    // // 6.保存最后一次入库时间
    // saveLatestSyncTime("latest_sitemap_time", new Date(), isNew);
    // }
    //
    // @Override
    // public void pingGoogle() {
    //
    // String url = "http://google.com/ping?sitemap=https://" + domain + "/sitemap.xml";
    // HttpUtils client = HttpUtils.getInstance();
    // try {
    // client.httpGet(url, null);
    // } catch (Exception e) {
    // logger.error("发起PingGoogle服务时出现异常", e);
    // }
    //
    // }
    //
    // @Override
    // public PagerEntity<WebTorrentEntity> search(String name, String sort, int pageNo, int pageSize) {
    // if (torrentEsClient == null) {
    // torrentEsClient = getElasticClient();
    // }
    // List<MatchQueryBuilder> querys = new ArrayList<MatchQueryBuilder>();
    // querys.add(QueryBuilders.matchQuery("name", name));
    // List<SortBuilder<?>> sorts = new ArrayList<SortBuilder<?>>();
    //
    // SortBuilder<?> sortBuilder = null;
    // if (sort != null) {
    // sortBuilder = SortBuilders.fieldSort(sort).order(SortOrder.DESC);
    // sorts.add(sortBuilder);
    // }
    // if (pageNo <= 0) {
    // pageNo = 1;
    // }
    //
    // return torrentEsClient.search(torrentIndex, torrentType, querys, sorts, pageNo, pageSize);
    // }
    //
    // /**
    // * TODO The function of this method is described here - Optional.
    // *
    // * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
    // */
    // @Override
    // public void afterPropertiesSet() throws Exception {
    // torrentEsClient = this.getElasticClient();
    // }
    //
    // public XContentBuilder createIKMapping(String indexType) {
    //
    // XContentBuilder mapping = null;
    // try {
    // mapping = XContentFactory.jsonBuilder().startObject()
    // // 索引库名（类似数据库中的表）
    // .startObject(indexType).startObject("properties").startObject("product_name")
    // .field("type", "string").field("analyzer", "ik").field("search_analyzer", "ik_smart").endObject()
    // .startObject("title_sub").field("type", "string").field("analyzer", "ik")
    // .field("search_analyzer", "ik_smart").endObject().startObject("title_primary")
    // .field("type", "string").field("analyzer", "ik").field("search_analyzer", "ik_smart").endObject()
    // .startObject("publisher").field("type", "string").field("analyzer", "ik")
    // .field("search_analyzer", "ik_smart").endObject().startObject("author_name").field("type", "string")
    // .field("analyzer", "ik").field("search_analyzer", "ik_smart").endObject()
    // // .field("boost",100).endObject()
    // // 姓名
    // // .startObject("name").field("type", "string").endObject()
    // // 位置
    // // .startObject("location").field("type",
    // // "geo_point").endObject()
    // //
    // .endObject().startObject("_all").field("analyzer","ik").field("search_analyzer","ik").endObject().endObject().endObject();
    // .endObject().endObject().endObject();
    // } catch (IOException e) {
    // e.printStackTrace();
    // }
    // return mapping;
    // }
}
